package org.magicsoft.office.test.excel.impt.demo2;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.SpreadsheetMLPackage;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.magicsoft.office.db.SQLType;
import org.magicsoft.office.excel.impt.ExcelImport;
import org.magicsoft.office.excel.model.Column;
import org.magicsoft.office.excel.model.DefaultValue;
import org.magicsoft.office.excel.model.File;
import org.magicsoft.office.excel.model.IDGenerator;
import org.magicsoft.office.excel.model.PrimaryKey;
import org.magicsoft.office.excel.model.Reference;
import org.magicsoft.office.excel.model.Sheet;
import org.magicsoft.office.excel.model.TargetTable;
import org.magicsoft.office.test.excel.impt.UUIDIDGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Demo2 {

	private static final Logger logger = LoggerFactory.getLogger(Demo2.class);

	private Connection con = null;

	private InputStream is = null;

	@Before
	public void before() throws ClassNotFoundException, SQLException, Docx4JException, FileNotFoundException {
		// Class.forName("oracle.jdbc.driver.OracleDriver");
		// String url = "jdbc:oracle:thin:@//192.168.10.18:1521/orc01";
		// String username = "oms_user";
		// String password = "oms_user";
		Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
		String url = "jdbc:sqlserver://localhost:1433;databaseName=test";
		String username = "sa";
		String password = "qwe123!@#";
		this.con = DriverManager.getConnection(url, username, password);
		this.is = Demo2.class.getResourceAsStream("Demo2模板.xlsx");

		// 预加载，排除第一次加载的耗时。
		SpreadsheetMLPackage.load(Demo2.class.getResourceAsStream("Demo2模板.xlsx"));
	}

	@Test
	public void testImport() {
		if (this.con == null || this.is == null) {
			return;
		}

		Date date1 = new Date();
		ExcelImport excelImport = new ExcelImport(this.con);
		excelImport.usePhysicalTable();//
		// 使用物理表可以帮助我们调式程序，看到导入结果，但正式运行时不建议调用。
		excelImport.retainTableAfterImport();
		excelImport.importFile(new File("Demo2模板.xlsx", this.getModel()), this.is);
		Date date2 = new Date();
		logger.info("导入完毕，总耗时：{}", ((date2.getTime() - date1.getTime()) / 1000));
	}

	@SuppressWarnings("serial")
	private List<Sheet> getModel() {
		IDGenerator idGenerator = new UUIDIDGenerator();

		List<DefaultValue> defaultValues = new ArrayList<DefaultValue>() {
			{
				this.add(new DefaultValue("version_", SQLType.INTEGER, 0));
			}
		};

		List<Sheet> sheets = new ArrayList<Sheet>();
		// sheets.add(new Sheet("【A1】有效证件类别", new ArrayList<TargetTable>() {
		// {
		// this.add(new TargetTable("cd_certificatetype", "t1")
		// .setPrimaryKey(new PrimaryKey("id_", SQLType.CHAR,
		// idGenerator)).setDefaultValues(defaultValues)
		// .updateByColumn("A"));
		// }
		// }, new ArrayList<Column>() {
		// {
		// this.add(new Column("A").bind("name_"));
		// this.add(new Column("B").bind("code_"));
		// this.add(new Column("C", SQLType.BOOLEAN).bind("active_"));
		// this.add(new Column("D", SQLType.CLOB).bind("description_"));
		// this.add(new Column("E", SQLType.INTEGER).bind("index_"));
		// }
		// }));
		// sheets.add(new Sheet("【A3】新社会阶层情况", new ArrayList<TargetTable>() {
		// {
		// this.add(new TargetTable("po_newsocialstrata")
		// .setPrimaryKey(new PrimaryKey("id_", SQLType.CHAR, idGenerator))
		// .setDefaultValues(defaultValues));
		// }
		// }, new ArrayList<Column>() {
		// {
		// this.add(new Column("A").bind("name_"));
		// this.add(new Column("B").bind("code_"));
		// this.add(new Column("C", SQLType.CLOB).bind("description_"));
		// this.add(new Column("D", SQLType.INTEGER).bind("index_"));
		// this.add(new Column("E", SQLType.BOOLEAN).bind("active_"));
		// }
		// }));
		// sheets.add(new Sheet("【A4】政治面貌", new ArrayList<TargetTable>() {
		// {
		// this.add(new TargetTable("cd_politicalstatus")
		// .setPrimaryKey(new PrimaryKey("id_", SQLType.CHAR, idGenerator))
		// .setDefaultValues(defaultValues));
		// }
		// }, new ArrayList<Column>() {
		// {
		// this.add(new Column("A").bind("name_"));
		// this.add(new Column("B").bind("code_"));
		// this.add(new Column("C", SQLType.BOOLEAN).bind("active_"));
		// this.add(new Column("D", SQLType.CLOB).bind("description_"));
		// this.add(new Column("E", SQLType.INTEGER).bind("index_"));
		// }
		// }));
		// sheets.add(new Sheet("【A5】户口性质", new ArrayList<TargetTable>() {
		// {
		// this.add(new TargetTable("po_accountproperties")
		// .setPrimaryKey(new PrimaryKey("id_", SQLType.CHAR, idGenerator))
		// .setDefaultValues(defaultValues));
		// }
		// }, new ArrayList<Column>() {
		// {
		// this.add(new Column("A").bind("name_"));
		// this.add(new Column("B").bind("code_"));
		// this.add(new Column("C", SQLType.CLOB).bind("description_"));
		// this.add(new Column("D", SQLType.INTEGER).bind("index_"));
		// this.add(new Column("E", SQLType.BOOLEAN).bind("active_"));
		// }
		// }));
		// sheets.add(new Sheet("【A6】婚姻状况", new ArrayList<TargetTable>() {
		// {
		// this.add(new TargetTable("cd_marriagestatus")
		// .setPrimaryKey(new PrimaryKey("id_", SQLType.CHAR, idGenerator))
		// .setDefaultValues(defaultValues));
		// }
		// }, new ArrayList<Column>() {
		// {
		// this.add(new Column("A").bind("name_"));
		// this.add(new Column("B").bind("code_"));
		// this.add(new Column("C", SQLType.BOOLEAN).bind("active_"));
		// this.add(new Column("D", SQLType.CLOB).bind("description_"));
		// this.add(new Column("E", SQLType.INTEGER).bind("index_"));
		// }
		// }));
		// sheets.add(new Sheet("【A7】性别", new ArrayList<TargetTable>() {
		// {
		// this.add(new TargetTable("cd_gender").setPrimaryKey(new
		// PrimaryKey("id_",
		// SQLType.CHAR, idGenerator))
		// .setDefaultValues(defaultValues));
		// }
		// }, new ArrayList<Column>() {
		// {
		// this.add(new Column("A").bind("name_"));
		// this.add(new Column("B").bind("code_"));
		// this.add(new Column("C", SQLType.BOOLEAN).bind("active_"));
		// this.add(new Column("D", SQLType.CLOB).bind("description_"));
		// this.add(new Column("E", SQLType.INTEGER).bind("index_"));
		// }
		// }));
		// sheets.add(new Sheet("【A8】党内职务", new ArrayList<TargetTable>() {
		// {
		// this.add(new TargetTable("po_cpctitle").setPrimaryKey(new
		// PrimaryKey("id_", SQLType.CHAR, idGenerator))
		// .setDefaultValues(defaultValues));
		// }
		// }, new ArrayList<Column>() {
		// {
		// this.add(new Column("A").bind("name_"));
		// this.add(new Column("B").bind("code_"));
		// this.add(new Column("C").bind("cpcpropid_")
		// .setReference(new Reference("po_cpcprop", "name0_", "id_",
		// SQLType.CHAR)));
		// this.add(new Column("D", SQLType.CLOB).bind("description_"));
		// this.add(new Column("E", SQLType.INTEGER).bind("index_"));
		// this.add(new Column("F", SQLType.BOOLEAN).bind("active_"));
		// }
		// }));
		// sheets.add(new Sheet("【A9】民族", new ArrayList<TargetTable>() {
		// {
		// this.add(new TargetTable("cd_nation").setPrimaryKey(new
		// PrimaryKey("id_",
		// SQLType.CHAR, idGenerator))
		// .setDefaultValues(defaultValues));
		// }
		// }, new ArrayList<Column>() {
		// {
		// this.add(new Column("A").bind("name_"));
		// this.add(new Column("B").bind("code_"));
		// this.add(new Column("C", SQLType.BOOLEAN).bind("active_"));
		// this.add(new Column("D", SQLType.CLOB).bind("description_"));
		// this.add(new Column("E", SQLType.INTEGER).bind("index_"));
		// }
		// }));
		sheets.add(new Sheet("【A10】行政区域", new ArrayList<TargetTable>() {
			{
				this.add(new TargetTable("cd_area").setPrimaryKey(new PrimaryKey("id_", SQLType.CHAR, idGenerator))
						.setDefaultValues(defaultValues));
			}
		}, new ArrayList<Column>() {
			private static final long serialVersionUID = 1L;
			{
				this.add(new Column("A").bind("name_"));
				this.add(new Column("B").bind("code_"));
				this.add(new Column("C").bind("alias_"));
				this.add(new Column("D").bind("parentid_")
						.setReference(new Reference("cd_area", "code_", "id_", SQLType.VARCHAR)));
				this.add(new Column("E", SQLType.BOOLEAN).bind("active_"));
				this.add(new Column("F", SQLType.CLOB).bind("description_"));
				this.add(new Column("G", SQLType.INTEGER).bind("index_"));
			}
		}));
		// sheets.add(new Sheet("【A11】健康状况", new ArrayList<TargetTable>() {
		// {
		// this.add(new TargetTable("cd_healthcondition")
		// .setPrimaryKey(new PrimaryKey("id_", SQLType.CHAR, idGenerator))
		// .setDefaultValues(defaultValues));
		// }
		// }, new ArrayList<Column>() {
		// private static final long serialVersionUID = 1L;
		// {
		// this.add(new Column("A").bind("name_"));
		// this.add(new Column("B").bind("parentid_"));
		// this.add(new Column("C").bind("code_"));
		// this.add(new Column("D", SQLType.BOOLEAN).bind("active_"));
		// this.add(new Column("E", SQLType.CLOB).bind("description_"));
		// this.add(new Column("F", SQLType.INTEGER).bind("index_"));
		// }
		// }));
		// sheets.add(new Sheet("【A12】发展类型", new ArrayList<TargetTable>() {
		// {
		// this.add(new TargetTable("po_recruitingmode")
		// .setPrimaryKey(new PrimaryKey("id_", SQLType.CHAR, idGenerator))
		// .setDefaultValues(defaultValues));
		// }
		// }, new ArrayList<Column>() {
		// {
		// this.add(new Column("A").bind("name_"));
		// this.add(new Column("B").bind("code_"));
		// this.add(new Column("C", SQLType.CLOB).bind("description_"));
		// this.add(new Column("D", SQLType.INTEGER).bind("index_"));
		// this.add(new Column("E", SQLType.BOOLEAN).bind("active_"));
		// }
		// }));
		// sheets.add(new Sheet("【A13】个人身份", new ArrayList<TargetTable>() {
		// {
		// this.add(new TargetTable("cd_individualstatus")
		// .setPrimaryKey(new PrimaryKey("id_", SQLType.CHAR, idGenerator))
		// .setDefaultValues(defaultValues));
		// }
		// }, new ArrayList<Column>() {
		// {
		// this.add(new Column("A").bind("name_"));
		// this.add(new Column("B").bind("code_"));
		// this.add(new Column("C", SQLType.BOOLEAN).bind("active_"));
		// this.add(new Column("D", SQLType.CLOB).bind("description_"));
		// this.add(new Column("E", SQLType.INTEGER).bind("index_"));
		// }
		// }));
		return sheets;
	}

	@After
	public void after() {
		if (is != null) {
			try {
				is.close();
			} catch (IOException e) {
				logger.error(e.getMessage(), e);
			}
		}
		if (con != null) {
			try {
				con.close();
			} catch (SQLException e) {
				logger.error(e.getMessage(), e);
			}
		}
	}

}
